package main


import (
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)
var (
	DB *gorm.DB
)
type Todo struct {
	ID int `json:"id"`
	Title string `json:"title"`
	Status bool `json:"status"`
}

func initsql() (err error) {
	dsn :="root:root@tcp(127.0.0.1:3306)/qwer?charset=utf8&parseTime=True&loc=Local"
	DB, err = gorm.Open("mysql", dsn)
	if err !=nil{
		return err
	}
	return DB.DB().Ping() // 如果可以PING通那么则返回 nil
}
func main()  {
	r := gin.Default()
	// 链接数据库
	err := initsql()
	if err != nil{
		panic(err)
	}
	defer DB.Close() // 延迟关闭数据库
	//绑定模型
	DB.AutoMigrate(&Todo{})
	//告诉 gin框架去哪个目录找 css静态文件
	r.Static("/static","static")
	// 告诉 gin框架去哪里找寻模板文件
	r.LoadHTMLGlob("templates/*")
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK,"index.html",nil)
	})

	//v1
	v1group :=r.Group("v1")
	{
		//待办事项
		// 增加
		v1group.POST("/todo", func(c *gin.Context) {
			// 首先获取前端页面输入的内容
			var todo Todo
			c.BindJSON(&todo)
			// 将获取的内容存入数据库
			//DB.Create(&todo)
			if err :=DB.Create(&todo).Error; err !=nil{
				c.JSON(http.StatusOK,gin.H{
					"message" : "error",
				})
			}else{
				c.JSON(http.StatusOK,todo)
			}
			// 返回响应
		})
		// 删除
		v1group.DELETE("/todo/:id", func(c *gin.Context) {
			id, ok:= c.Params.Get("id")
			if !ok{
				c.JSON(http.StatusOK,gin.H{
					"message":err,
				})
				return
			}else{
				if err2 := DB.Where("id=?", id).Delete(Todo{}).Error ; err2!=nil{
					c.JSON(http.StatusOK,gin.H{
						"message":err,
					})
				}else{
					c.JSON(http.StatusOK,gin.H{
						id :"deleted",
					})
				}
			}
		})
		// 改
		v1group.PUT("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok{
				c.JSON(http.StatusOK,gin.H{
					"message":err,
				})
				return
			}else{
				var todo Todo
				if err2 := DB.Where("id=?", id).First(&todo).Error; err!=nil{
					c.JSON(http.StatusOK,gin.H{"error":err2})
				}
				c.BindJSON(&todo)
			if err2 := DB.Save(&todo).Error;err2!=nil{
				c.JSON(http.StatusOK,gin.H{
					"message": err2,
				})
			}else{
				c.JSON(http.StatusOK,gin.H{
					"message": todo,
				})
			}
			}
		})
		// 查询
		//查看所有的待办事项
		v1group.GET("/todo", func(c *gin.Context) {
			//查询todo表中的所有数据
			var todolist []Todo
			if err2 := DB.Find(&todolist).Error ;err2 != nil{
				c.JSON(http.StatusOK,gin.H{
					"messagr" :"error",
				})
			}else{
				c.JSON(http.StatusOK,todolist)
			}
		})
	}





	r.Run(":9421")
}
